package pro5_decoder_encoder.ex2_encoder.codec;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import pro5_decoder_encoder.ex2_encoder.bean.Msg;
import pro5_decoder_encoder.ex2_encoder.bean.MsgHeader;
import pro5_decoder_encoder.ex2_encoder.bean.MsgType;

import java.nio.charset.Charset;

//将Msg消息转为ByteBuf类型   编码器
public class MyEncoder extends MessageToByteEncoder<Msg> {

    @Override
    protected void encode(ChannelHandlerContext ctx, Msg msg, ByteBuf out) throws Exception {
        if (msg == null | msg.getMsgHeader() == null) {
            throw new Exception("The encode message is null");
        }
        // 获取消息头
        MsgHeader header = msg.getMsgHeader();
        // 获取消息体
        String body = msg.getBody();
        byte[] bodyBytes = body.getBytes(Charset.forName("utf-8"));
        // 计算消息体的长度
        int bodySize = bodyBytes.length;

        System.out.printf("MyEncoder header: %s, body: %s", header.getMsgType(), body);

        //消息的协议格式为:  消息类型(1字节) + 消息长度(4字节) + 消息体(变长)
        out.writeByte(MsgType.EMGW_LOGIN_RES.getValue());
        out.writeInt(bodySize);
        out.writeBytes(bodyBytes);
    }

}
